Diese Lerneinheit behandelt die Data Definition Language, kurz DDL. Sie ist ein Teil von SQL und legt die Struktur einer Datenbank fest. DDL beschreibt, ändert und entfernt Datenstrukturen. Sie legt fest, welche Tabellen es gibt, welche Spalten sie haben und welche Datentypen verwendet werden. DDL ist wie ein Bauplan. Bevor Fenster und Türen kommen, braucht es Wände und Räume. Mit CREATE TABLE kann man zum Beispiel eine neue Tabelle für Kundendaten anlegen. Mit ALTER TABLE kann man eine Spalte hinzufügen. Sie dient der Struktur, nicht den Inhalten. Die wichtigsten Befehle sind CREATE, ALTER und DROP. "CREATE TABLE" ist ein zentraler DDL-Befehl. Damit legt man eine neue Tabelle an, etwa „Rechnung“ mit Spalten wie Rechnungsnummer und Datum. Jede Spalte bekommt einen passenden Datentyp: INT für die Nummer und DATE für das Datum. Mit "CREATE TABLE" wird die Struktur definiert, die später mit Daten gefüllt wird. Es ist vergleichbar mit einem Skelett, das später durch DML-Befehle wie INSERT mit Daten gefüllt wird. In SQL gibt es im Wesentlichen vier Begrenzer, die man unterscheiden sollte, und zwar anhand ihrer offiziellen Bezeichnungen: Erstens das einfache Hochkomma, oft auch „Apostroph“ genannt. Das ist ASCII-39. Dieses Zeichen dient überall dort zur Kennzeichnung von Text-Literalen, wo ein Zeichenkettenwert direkt in der Abfrage auftaucht. Möchte man im Stringinneren selbst ein solches einfaches Hochkomma unterbringen, verdoppelt man es, damit der Parser erkennt, dass es nicht das Ende des Literals bedeutet. Zweitens das doppelte Anführungszeichen, also das klassische Anführungs- oder Gänsefüßchen. ANSI-SQL schreibt vor, dass man damit Bezeichner umschließen kann, um beispielsweise Sonderzeichen zuzulassen oder Groß- und Kleinschreibung im Namen zu erhalten. Drittens gibt es in vielen MySQL-Installationen noch das sogenannte Backtick (ASCII-96), in der SQL-Terminologie auch Gravis-Akzent genannt. Dieses Zeichen übernimmt dort die Funktion des doppelten Anführungszeichens und grenzt Tabellen- oder Spaltennamen ab, wenn man etwa reservierte Wörter als Bezeichner verwenden möchte oder Leerzeichen und Sonderzeichen im Namen stehen. Viertens gibt es noch das akute Akzentzeichen, manchmal einfach „Akutzeichen“ genannt. Das ist Unicode B4. Dieses Zeichen spielt in SQL jedoch keine Rolle und wird von praktisch keinem Dialekt als gültiger String- oder Bezeichnerbegrenzer anerkannt. Wer versehentlich das Akutzeichen verwendet, erhält daher in der Regel eine Fehlermeldung, weil der SQL-Parser nicht erkennt, dass hier ein Literal beginnen oder enden soll. Zusammengefasst also: String-Literale umschließt man mit dem Apostroph, Bezeichner (wenn nötig) mit dem doppelten Anführungszeichen oder – in MySQL-Systemen – mit dem Backtick, und das akute Akzentzeichen wird in SQL gar nicht als Begrenzer benutzt. Ein Index in einer Datenbank beschleunigt Suchvorgänge. Er ist eine separate Datenstruktur, die sich auf eine oder mehrere Spalten einer Tabelle bezieht. Anstatt jede Zeile einzeln zu durchsuchen, nutzt das System Zeiger, um gezielt auf bestimmte Werte zuzugreifen. Meist kommen B+-Bäume zum Einsatz. Sie ermöglichen eine Suche mit logarithmischer Komplexität, die deutlich schneller ist als eine lineare Durchmusterung. Das lässt sich mit einem Inhaltsverzeichnis in einem Buch vergleichen. Statt jede Seite durchzublättern, springt man direkt zur richtigen Stelle. Ein Index bezieht sich meist auf eine Spalte. Zusammengesetzte Indizes sind möglich, zum Beispiel auf Vorname und Nachname. Spalten, die Primärschlüssel enthalten, werden automatisch indiziert. Oft reicht der Primärindex nicht aus, daher gibt es zusätzlich Sekundärindizes. "CREATE INDEX Indexname ON Tabellenname" und in Klammern ein oder mehrere Spaltennamen: Dieser Befehl zeigt, wie ein Index in SQL erzeugt wird. Die genaue Syntax kann je nach Datenbanksystem leicht abweichen, doch CREATE INDEX ist weit verbreitet. In PhpMyAdmin wird beim Export statt INDEX oft KEY angezeigt. Ein Primärschlüssel identifiziert jede Zeile eindeutig. Er darf nicht leer oder doppelt vorkommen. In der Tabelle Kunde ist das zum Beispiel die Kundennummer. Primärschlüssel werden meist direkt mit "CREATE TABLE" definiert. Dabei wird automatisch ein Index erstellt. Weitere Schlüssel sind möglich, etwa Fremdschlüssel oder zusätzliche Suchschlüssel. Der Befehl "DROP" entfernt Tabellen, Indizes oder Views dauerhaft aus der Datenbank. Beispiel: "DROP TABLE IF EXISTS kunde". Dieser Befehl löscht die Tabelle Kunde, wenn sie existiert. Das IF EXISTS verhindert eine Fehlermeldung, falls das Objekt nicht existiert. "DROP" ist endgültig. Gelöschte Strukturen lassen sich nur mit Backups wiederherstellen. MyISAM ist eine ältere Storage-Engine in MySQL und MariaDB. Sie war bis Version 5.5 Standard, wurde aber durch InnoDB abgelöst. Sie ist schnell beim Lesen, unterstützt aber keine Transaktionen oder referenzielle Integrität. Geeignet ist sie für selten veränderte Daten wie Archive. Ein Nachteil ist, dass es bei Fehlern zu inkonsistenten Daten kommen kann. InnoDB ist die moderne Standard-Engine für MySQL und MariaDB. Sie unterstützt Transaktionen und Fremdschlüssel und sorgt so für Datensicherheit und Konsistenz. Entwickelt wurde sie von Innobase Oy, die 2005 von Oracle übernommen wurde. InnoDB eignet sich für produktive Systeme mit vielen gleichzeitigen Zugriffen. Die Zeichencodierung legt fest, wie Zeichen gespeichert werden. Für Textfelder wie VARCHAR oder TEXT ist ein passendes Charset wichtig. UTF-8 ist weit verbreitet und unterstützt Umlaute, Emojis und andere Schriftsysteme. Charset muss bei Tabellenerstellung und bei der Verbindung zur Datenbank übereinstimmen. Sonst wird aus einem ü ein Fragezeichen. Eine Änderung ist später möglich, wenn die alten Daten kompatibel sind. Collation definiert, wie Zeichen verglichen und sortiert werden. Zum Beispiel, ob Ä wie A behandelt wird. Charset ist für die korrekte Speicherung zuständig, Collation für die Sortierung. Character Set ist ein umgangssprachlicher Begriff – korrekt ist Character Encoding. Mit ALTER TABLE lässt sich Charset und Collation nachträglich ändern. Beispiel: ci bedeutet case-insensitive – Groß- und Kleinschreibung wird ignoriert. utf8-general-ci ist schnell, sortiert aber Sonderzeichen ungenau. utf8\_unicode\_ci ist exakter, aber langsamer. Eine View ist eine virtuelle Tabelle, die auf einer gespeicherten Abfrage basiert. Sie zeigt beim Aufruf das aktuelle Ergebnis. Man kann eine View wie eine Tabelle abfragen, aber sie speichert keine Daten. Beispiel: Statt jedes Mal eine Abfrage zu schreiben, um alle aktiven Kunden zu sehen, erstellt man eine View, die genau diese Filterung enthält. Mit CREATE VIEW erstellt man eine benutzerdefinierte Sicht auf bestimmte Daten. Die View erhält einen Namen und basiert auf einer SELECT-Anweisung. In diesem Beispiel fasst die Sicht alle Verkäufe von Softwareprodukten zusammen, indem sie die produkt-id zur Verknüpfung verwendet. Danach kann man gezielt auf die Sicht zugreifen, zum Beispiel mit "SELECT verkäufer FROM Software-Verkäufe". Views vereinfachen komplexe Datenbankschemata. In einer normalisierten Datenbank sind Informationen auf viele Tabellen verteilt. Eine View bündelt relevante Daten in einer übersichtlichen virtuellen Tabelle. So können auch Nutzer ohne Wissen gezielt Abfragen durchführen, ohne die Normalisierung aufzugeben. Beispiel: Es gibt die Tabellen Kunde, Bestellung und Produkt. Um eine Liste zu erhalten, welche Kunden welche Produkte gekauft haben, müsste man mehrere Tabellen mit JOINs verknüpfen. Mit einer View Kunden-Einkäufe könnte man diese Verknüpfung einmal definieren. Danach reicht ein einfacher Befehl wie "SELECT * FROM Kunden-Einkäufe", um die gewünschten Informationen abzurufen. Ein weiterer Vorteil von Sichten ist, dass das DBMS keinen zusätzlichen Aufwand zur Vorbereitung der Abfrage benötigt. Die Sicht-Abfrage wurde vom Parser bereits bei der Erstellung syntaktisch zerlegt und vom Anfrageoptimierer vereinfacht. Ein Nachteil von Sichten kann sein, dass die Komplexität der dahinter liegenden Abfrage unterschätzt wird. Der Aufruf einer Sicht kann zu sehr aufwändigen Abfragen führen und der unbedachte Einsatz solcher dann zu erheblichen Performanceproblemen.